「喂?」山姆拿起對講機,試著聯絡村子裡的長老。
「我在這座黑森林裡,找到很多水晶,這樣不知道可以賣多少錢?」山姆期待著長老的回應。
長老想了一下,露出慈祥(?)的微笑。
「這些水晶,我 50 收!」
PS. 這裡是開發 iOS 手機遊戲的系列文,如果還沒看過之前
劇情文章的朋友,歡迎先點這邊回顧唷!
我們用程式碼新增顯示遊戲總分的文字,放在遊戲畫面的最上方
scoreNode,給它一個灰底顏色,寬度與螢幕同寬,高 30anchorPoint 為 CGPoint(x: 0, y: 0.5)
scoreNode 加到遊戲場景裡labelScore,讓他顯示的文字為 Score: \(score),將標題與分數組合起來顯示fontColor:設定文字顏色fontSize:設定文字大小fontName:設定字體position:設定位置horizontalAlignmentMode:設定水平對齊方式verticalAlignmentMode:設定垂直對齊方式labelScore 加到 scoreNode 裡score
在 applySafeArea 方法裡調整位置:
scoreNode 的高topSafeArea 跟自身一半的高 (因 anchorPoint y 為 0.5)class GameScene: SKScene {
    ...
    var scoreNode: SKSpriteNode?
    var labelScore: SKLabelNode?
    var score: Int = 0
    
    override func didMove(to view: SKView) {
        ...
        self.scoreNode = SKSpriteNode(color: .darkGray, size: CGSize(width: CGFloat(self.size.width), height: CGFloat(30)))
        self.labelScore = SKLabelNode(text: "Score: \(score)")
        if let scoreNode = self.scoreNode, let labelScore = self.labelScore {
            scoreNode.anchorPoint = CGPoint(x: 0, y: 0.5)
            self.addChild(scoreNode)
            labelScore.fontColor = UIColor.white
            labelScore.fontSize = CGFloat(24)
            labelScore.fontName = "Copperplate"
            labelScore.position = CGPoint(x: 10, y: 0)
            labelScore.horizontalAlignmentMode = .left
            labelScore.verticalAlignmentMode = .center
            scoreNode.addChild(labelScore)
        }
    }
    
    func applySafeArea() {
        ...
//        if let mapNode = self.mapNode {
//            mapNode.position = CGPoint(x: 0, y: -self.topSafeArea)
//        }
        if let mapNode = self.mapNode, let scoreNode = self.scoreNode {
            mapNode.position = CGPoint(x: 0, y: -self.topSafeArea - scoreNode.size.height)
            scoreNode.position =  CGPoint(x: 0 ,y: -self.topSafeArea - scoreNode.size.height/2)
        }
    }
}

先新增一個加分的方法 addScore(add: Int),改變 score 變數的值,也改變 labelScore 顯示的文字
class GameScene: SKScene {
    ...
    func addScore(add: Int) {
        self.score += add
        self.labelScore?.text = "Score: \(self.score)"
    }
}
主角與水晶碰觸時,加上水晶得分:10
class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for crystal in self.crystals where !crystal.isGotten && crystal.gridX == sam.gridX && crystal.gridY == sam.gridY {
            ...
            self.addScore(add: 10)
        }
    }
}
主角與魔幻水晶碰觸時,加上魔幻水晶得分:100
class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for magicCrystal in self.magicCrystals where !magicCrystal.isGotten && magicCrystal.gridX == sam.gridX && magicCrystal.gridY == sam.gridY {
            ...
            self.addScore(add: 100)
        }
    }
}
主角與香菇碰觸時,加上香菇得分:200
class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for mushroom in self.mushrooms where !mushroom.isGotten && mushroom.gridX == sam.gridX && mushroom.gridY == sam.gridY {
            ...
            self.addScore(add: 200)
        }
    }
}
主角與怪物碰觸,且怪物模式為逃逸時,加上擊退得分:50
class GameScene: SKScene {
    ...
    override func update(_ currentTime: TimeInterval) {
        for weather in self.weathers where (weather.gridX == sam.gridX && abs(weather.node.position.y - sam.node.position.y) <= CGFloat(self.gridWH + 6) || weather.gridY == sam.gridY && abs(weather.node.position.x - sam.node.position.x) <= CGFloat(self.gridWH + 6)) && (gridMapping.purpleTree.x != sam.gridX && gridMapping.purpleTree.y != sam.gridY)
        {
            if weather.mode == .ATTACK || weather.mode == .PLAY {
                ...
            } else if weather.mode == .ESCAPE {
                ...
                self.addScore(add: 50)
            }
        }
    }
}
成功將分數累積在畫面上方囉!
目前我們已經可以計算得分囉~但是...
累積的得分在關閉遊戲後,就會重置了,辛苦得來的分數就這樣飛了 
還缺少將最高得分紀錄起來的功能!
遊戲要能破紀錄,才會更有挑戰性~
明日會教大家如何將最高得分紀錄在本機裡。